home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / tools / gcc / gcc270_src.lha / gcc-2.7.0-amiga / config / elxsi / elxsi.md < prev    next >
Encoding:
Text File  |  1995-06-15  |  38.7 KB  |  1,421 lines

  1. ;;- Machine description for GNU compiler, Elxsi Version
  2. ;;  Copyright (C) 1987, 1988, 1992, 1994 Free Software Foundation, Inc.
  3. ;;  Contributed by Mike Stump <mrs@cygnus.com> in 1988, and is the first
  4. ;;  64 bit port of GNU CC.
  5. ;;  Based upon the VAX port.
  6.  
  7. ;; This file is part of GNU CC.
  8.  
  9. ;; GNU CC is free software; you can redistribute it and/or modify
  10. ;; it under the terms of the GNU General Public License as published by
  11. ;; the Free Software Foundation; either version 1, or (at your option)
  12. ;; any later version.
  13.  
  14. ;; GNU CC is distributed in the hope that it will be useful,
  15. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;; GNU General Public License for more details.
  18.  
  19. ;; You should have received a copy of the GNU General Public License
  20. ;; along with GNU CC; see the file COPYING.  If not, write to
  21. ;; the Free Software Foundation, 59 Temple Place - Suite 330,
  22. ;; Boston, MA 02111-1307, USA.
  23.  
  24.  
  25. ;;- Instruction patterns.  When multiple patterns apply,
  26. ;;- the first one in the file is chosen.
  27. ;;-
  28. ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
  29. ;;-
  30. ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
  31. ;;- updates for most instructions.
  32.  
  33.  
  34. (define_insn ""
  35.   [(set (reg:SI 15)
  36.      (plus:SI (reg:SI 15)
  37.           (match_operand:SI 0 "general_operand" "g")))]
  38.   ""
  39.   "add.64\\t.sp,%0")
  40.  
  41. (define_insn ""
  42.   [(set (reg:SI 15)
  43.      (plus:SI (match_operand:SI 0 "general_operand" "g")
  44.           (reg:SI 15)))]
  45.   ""
  46.   "add.64\\t.sp,%0")
  47.  
  48. (define_insn ""
  49.   [(set (match_operand:SI 0 "register_operand" "r")
  50.      (plus:SI (reg:SI 15)
  51.           (match_operand:SI 1 "general_operand" "g")))]
  52.   ""
  53.   "ld.32\\t%0,.sp\;add.64\\t%0,%1")
  54.  
  55. (define_insn ""
  56.   [(set (match_operand:SI 0 "register_operand" "r")
  57.      (plus:SI (match_operand:SI 1 "general_operand" "g")
  58.           (reg:SI 15)))]
  59.   ""
  60.   "ld.32\\t%0,.sp\;add.64\\t%0,%1")
  61.  
  62. (define_insn ""
  63.   [(set (reg:SI 15)
  64.      (minus:SI (reg:SI 15)
  65.            (match_operand:SI 0 "general_operand" "g")))]
  66.   ""
  67.   "sub.64\\t.sp,%0")
  68.  
  69. (define_insn ""
  70.   [(set (reg:SI 15)
  71.      (match_operand:SI 0 "general_operand" "rm"))]
  72.   ""
  73.   "ld.32\\t.sp,%0")
  74.  
  75. (define_insn ""
  76.   [(set (match_operand:SI 0 "general_operand" "m,r")
  77.      (reg:SI 15))]
  78.   ""
  79.   "*
  80.   if (which_alternative == 0)
  81.     return \"st.32\\t.sp,%0\";
  82.   return \"ld.32\\t%0,.sp\";
  83. ")
  84.  
  85. ; tstdi is first test insn so that it is the one to match
  86. ; a constant argument.
  87.  
  88. (define_insn "tstdi"
  89.   [(set (cc0)
  90.     (match_operand:DI 0 "register_operand" "r"))]
  91.   ""
  92.   "*
  93.     extern rtx cmp_op0, cmp_op1;
  94.     cmp_op0=operands[0]; cmp_op1=0;
  95.     return \";\\ttstdi\\t%0\";
  96. ")
  97.  
  98. (define_insn "tstdf"
  99.   [(set (cc0)
  100.     (match_operand:DF 0 "register_operand" "r"))]
  101.   ""
  102.   "*
  103.     extern rtx cmp_op0, cmp_op1;
  104.     cmp_op0=operands[0]; cmp_op1=0;
  105.     return \";\\ttstdf\\t%0\";
  106. ")
  107.  
  108. (define_insn "tstsf"
  109.   [(set (cc0)
  110.     (match_operand:SF 0 "register_operand" "r"))]
  111.   ""
  112.   "*
  113.     extern rtx cmp_op0, cmp_op1;
  114.     cmp_op0=operands[0]; cmp_op1=0;
  115.     return \";\\ttstsf\\t%0\";
  116. ")
  117.  
  118. (define_insn "cmpdi"
  119.   [(set (cc0)
  120.     (compare (match_operand:DI 0 "register_operand" "r")
  121.          (match_operand:DI 1 "general_operand" "rm")))]
  122.   ""
  123.   "*
  124.     extern rtx cmp_op0, cmp_op1;
  125.     cmp_op0=operands[0]; cmp_op1=operands[1];
  126.     return \";\\tcmpdi\\t%0,%1\";
  127. ")
  128.  
  129. (define_insn "cmpdf"
  130.   [(set (cc0)
  131.     (compare (match_operand:DF 0 "register_operand" "r")
  132.          (match_operand:DF 1 "general_operand" "rm")))]
  133.   ""
  134.   "*
  135.     extern rtx cmp_op0, cmp_op1;
  136.     cmp_op0=operands[0]; cmp_op1=operands[1];
  137.     return \";\\tcmpdf\\t%0,%1\";
  138. ")
  139.  
  140. (define_insn "cmpsf"
  141.   [(set (cc0)
  142.     (compare (match_operand:SF 0 "register_operand" "r")
  143.          (match_operand:SF 1 "general_operand" "rm")))]
  144.   ""
  145.   "*
  146.     extern rtx cmp_op0, cmp_op1;
  147.     cmp_op0=operands[0]; cmp_op1=operands[1];
  148.     return \";\\tcmpsf\\t%0,%1\";
  149. ")
  150.  
  151. (define_insn ""
  152.   [(set (match_operand:DI 0 "register_operand" "=r")
  153.         (eq (match_operand:DI 1 "register_operand" "r")
  154.              (match_operand:DI 2 "general_operand" "g")))]
  155.   ""
  156.   "cmp.64\\t%0,%1,%2:eq")
  157.  
  158. (define_insn ""
  159.   [(set (match_operand:DI 0 "register_operand" "=r")
  160.         (ne (match_operand:DI 1 "register_operand" "r")
  161.              (match_operand:DI 2 "general_operand" "g")))]
  162.   ""
  163.   "cmp.64\\t%0,%1,%2:ne")
  164.  
  165. (define_insn ""
  166.   [(set (match_operand:DI 0 "register_operand" "=r")
  167.         (le (match_operand:DI 1 "register_operand" "r")
  168.              (match_operand:DI 2 "general_operand" "g")))]
  169.   ""
  170.   "cmp.64\\t%0,%1,%2:le")
  171.  
  172. (define_insn ""
  173.   [(set (match_operand:DI 0 "register_operand" "=r")
  174.         (leu (match_operand:DI 1 "register_operand" "r")
  175.              (match_operand:DI 2 "general_operand" "g")))]
  176.   ""
  177.   "cmpu.64\\t%0,%1,%2:le")
  178.  
  179. (define_insn ""
  180.   [(set (match_operand:DI 0 "register_operand" "=r")
  181.         (lt (match_operand:DI 1 "register_operand" "r")
  182.              (match_operand:DI 2 "general_operand" "g")))]
  183.   ""
  184.   "cmp.64\\t%0,%1,%2:lt")
  185.  
  186. (define_insn ""
  187.   [(set (match_operand:DI 0 "register_operand" "=r")
  188.         (ltu (match_operand:DI 1 "register_operand" "r")
  189.              (match_operand:DI 2 "general_operand" "g")))]
  190.   ""
  191.   "cmpu.64\\t%0,%1,%2:lt")
  192.  
  193. (define_insn ""
  194.   [(set (match_operand:DI 0 "register_operand" "=r")
  195.         (ge (match_operand:DI 1 "register_operand" "r")
  196.              (match_operand:DI 2 "general_operand" "g")))]
  197.   ""
  198.   "cmp.64\\t%0,%1,%2:ge")
  199.  
  200. (define_insn ""
  201.   [(set (match_operand:DI 0 "register_operand" "=r")
  202.         (geu (match_operand:DI 1 "register_operand" "r")
  203.              (match_operand:DI 2 "general_operand" "g")))]
  204.   ""
  205.   "cmpu.64\\t%0,%1,%2:ge")
  206.  
  207. (define_insn ""
  208.   [(set (match_operand:DI 0 "register_operand" "=r")
  209.         (gt (match_operand:DI 1 "register_operand" "r")
  210.              (match_operand:DI 2 "general_operand" "g")))]
  211.   ""
  212.   "cmp.64\\t%0,%1,%2:gt")
  213.  
  214. (define_insn ""
  215.   [(set (match_operand:DI 0 "register_operand" "=r")
  216.         (gtu (match_operand:DI 1 "register_operand" "r")
  217.              (match_operand:DI 2 "general_operand" "g")))]
  218.   ""
  219.   "cmpu.64\\t%0,%1,%2:gt")
  220.  
  221. (define_insn "seq"
  222.   [(set (match_operand:DI 0 "register_operand" "=r")
  223.     (eq (cc0) (const_int 0)))]
  224.   ""
  225.   "* return cmp_set(\"\", \"eq\", operands[0]); ")
  226.  
  227. (define_insn "sne"
  228.   [(set (match_operand:DI 0 "register_operand" "=r")
  229.     (ne (cc0) (const_int 0)))]
  230.   ""
  231.   "* return cmp_set(\"\", \"ne\", operands[0]); ")
  232.  
  233. (define_insn "sle"
  234.   [(set (match_operand:DI 0 "register_operand" "=r")
  235.     (le (cc0) (const_int 0)))]
  236.   ""
  237.   "* return cmp_set(\"\", \"le\", operands[0]); ")
  238.  
  239. (define_insn "sleu"
  240.   [(set (match_operand:DI 0 "register_operand" "=r")
  241.     (leu (cc0) (const_int 0)))]
  242.   ""
  243.   "* return cmp_set(\"u\", \"le\", operands[0]); ")
  244.  
  245. (define_insn "slt"
  246.   [(set (match_operand:DI 0 "register_operand" "=r")
  247.     (lt (cc0) (const_int 0)))]
  248.   ""
  249.   "* return cmp_set(\"\", \"lt\", operands[0]); ")
  250.  
  251. (define_insn "sltu"
  252.   [(set (match_operand:DI 0 "register_operand" "=r")
  253.     (ltu (cc0) (const_int 0)))]
  254.   ""
  255.   "* return cmp_set(\"u\", \"lt\", operands[0]); ")
  256.  
  257. (define_insn "sge"
  258.   [(set (match_operand:DI 0 "register_operand" "=r")
  259.     (ge (cc0) (const_int 0)))]
  260.   ""
  261.   "* return cmp_set(\"\", \"ge\", operands[0]); ")
  262.  
  263. (define_insn "sgeu"
  264.   [(set (match_operand:DI 0 "register_operand" "=r")
  265.     (geu (cc0) (const_int 0)))]
  266.   ""
  267.   "* return cmp_set(\"u\", \"ge\", operands[0]); ")
  268.  
  269. (define_insn "sgt"
  270.   [(set (match_operand:DI 0 "register_operand" "=r")
  271.     (gt (cc0) (const_int 0)))]
  272.   ""
  273.   "* return cmp_set(\"\", \"gt\", operands[0]); ")
  274.  
  275. (define_insn "sgtu"
  276.   [(set (match_operand:DI 0 "register_operand" "=r")
  277.     (gtu (cc0) (const_int 0)))]
  278.   ""
  279.   "* return cmp_set(\"u\", \"gt\", operands[0]); ")
  280.  
  281. (define_insn ""
  282.   [(set (match_operand:SI 0 "register_operand" "=r")
  283.     (eq (match_operand:SI 1 "register_operand" "r")
  284.         (match_operand:SI 2 "general_operand" "m")))]
  285.   ""
  286.   "cmp.32\\t%0,%1,%2:eq")
  287.  
  288. (define_insn ""
  289.   [(set (match_operand:SI 0 "register_operand" "=r")
  290.     (ne (match_operand:SI 1 "register_operand" "r")
  291.         (match_operand:SI 2 "general_operand" "m")))]
  292.   ""
  293.   "cmp.32\\t%0,%1,%2:ne")
  294.  
  295. (define_insn ""
  296.   [(set (match_operand:SI 0 "register_operand" "=r")
  297.     (le (match_operand:SI 1 "register_operand" "r")
  298.         (match_operand:SI 2 "general_operand" "m")))]
  299.   ""
  300.   "cmp.32\\t%0,%1,%2:le")
  301.  
  302. (define_insn ""
  303.   [(set (match_operand:SI 0 "register_operand" "=r")
  304.     (leu (match_operand:SI 1 "register_operand" "r")
  305.         (match_operand:SI 2 "general_operand" "m")))]
  306.   ""
  307.   "cmpu.32\\t%0,%1,%2:le")
  308.  
  309. (define_insn ""
  310.   [(set (match_operand:SI 0 "register_operand" "=r")
  311.     (lt (match_operand:SI 1 "register_operand" "r")
  312.         (match_operand:SI 2 "general_operand" "m")))]
  313.   ""
  314.   "cmp.32\\t%0,%1,%2:lt")
  315.  
  316. (define_insn ""
  317.   [(set (match_operand:SI 0 "register_operand" "=r")
  318.     (ltu (match_operand:SI 1 "register_operand" "r")
  319.         (match_operand:SI 2 "general_operand" "m")))]
  320.   ""
  321.   "cmpu.32\\t%0,%1,%2:lt")
  322.  
  323. (define_insn ""
  324.   [(set (match_operand:SI 0 "register_operand" "=r")
  325.     (ge (match_operand:SI 1 "register_operand" "r")
  326.         (match_operand:SI 2 "general_operand" "m")))]
  327.   ""
  328.   "cmp.32\\t%0,%1,%2:ge")
  329.  
  330. (define_insn ""
  331.   [(set (match_operand:SI 0 "register_operand" "=r")
  332.     (geu (match_operand:SI 1 "register_operand" "r")
  333.         (match_operand:SI 2 "general_operand" "m")))]
  334.   ""
  335.   "cmpu.32\\t%0,%1,%2:ge")
  336.  
  337. (define_insn ""
  338.   [(set (match_operand:SI 0 "register_operand" "=r")
  339.     (gt (match_operand:SI 1 "register_operand" "r")
  340.         (match_operand:SI 2 "general_operand" "m")))]
  341.   ""
  342.   "cmp.32\\t%0,%1,%2:gt")
  343.  
  344. (define_insn ""
  345.   [(set (match_operand:SI 0 "register_operand" "=r")
  346.     (gtu (match_operand:SI 1 "register_operand" "r")
  347.         (match_operand:SI 2 "general_operand" "m")))]
  348.   ""
  349.   "cmpu.32\\t%0,%1,%2:gt")
  350.  
  351. (define_insn ""
  352.   [(set (match_operand:HI 0 "register_operand" "=r")
  353.     (eq (match_operand:HI 1 "register_operand" "r")
  354.         (match_operand:HI 2 "general_operand" "m")))]
  355.   ""
  356.   "cmp.16\\t%0,%1,%2:eq")
  357.  
  358. (define_insn ""
  359.   [(set (match_operand:HI 0 "register_operand" "=r")
  360.     (ne (match_operand:HI 1 "register_operand" "r")
  361.         (match_operand:HI 2 "general_operand" "m")))]
  362.   ""
  363.   "cmp.16\\t%0,%1,%2:ne")
  364.  
  365. (define_insn ""
  366.   [(set (match_operand:HI 0 "register_operand" "=r")
  367.     (le (match_operand:HI 1 "register_operand" "r")
  368.         (match_operand:HI 2 "general_operand" "m")))]
  369.   ""
  370.   "cmp.16\\t%0,%1,%2:le")
  371.  
  372. (define_insn ""
  373.   [(set (match_operand:HI 0 "register_operand" "=r")
  374.     (leu (match_operand:HI 1 "register_operand" "r")
  375.         (match_operand:HI 2 "general_operand" "m")))]
  376.   ""
  377.   "cmpu.16\\t%0,%1,%2:le")
  378.  
  379. (define_insn ""
  380.   [(set (match_operand:HI 0 "register_operand" "=r")
  381.     (lt (match_operand:HI 1 "register_operand" "r")
  382.         (match_operand:HI 2 "general_operand" "m")))]
  383.   ""
  384.   "cmp.16\\t%0,%1,%2:lt")
  385.  
  386. (define_insn ""
  387.   [(set (match_operand:HI 0 "register_operand" "=r")
  388.     (ltu (match_operand:HI 1 "register_operand" "r")
  389.         (match_operand:HI 2 "general_operand" "m")))]
  390.   ""
  391.   "cmpu.16\\t%0,%1,%2:lt")
  392.  
  393. (define_insn ""
  394.   [(set (match_operand:HI 0 "register_operand" "=r")
  395.     (ge (match_operand:HI 1 "register_operand" "r")
  396.         (match_operand:HI 2 "general_operand" "m")))]
  397.   ""
  398.   "cmp.16\\t%0,%1,%2:ge")
  399.  
  400. (define_insn ""
  401.   [(set (match_operand:HI 0 "register_operand" "=r")
  402.     (geu (match_operand:HI 1 "register_operand" "r")
  403.         (match_operand:HI 2 "general_operand" "m")))]
  404.   ""
  405.   "cmpu.16\\t%0,%1,%2:ge")
  406.  
  407. (define_insn ""
  408.   [(set (match_operand:HI 0 "register_operand" "=r")
  409.     (gt (match_operand:HI 1 "register_operand" "r")
  410.         (match_operand:HI 2 "general_operand" "m")))]
  411.   ""
  412.   "cmp.16\\t%0,%1,%2:gt")
  413.  
  414. (define_insn ""
  415.   [(set (match_operand:HI 0 "register_operand" "=r")
  416.     (gtu (match_operand:HI 1 "register_operand" "r")
  417.         (match_operand:HI 2 "general_operand" "m")))]
  418.   ""
  419.   "cmpu.16\\t%0,%1,%2:gt")
  420.  
  421. (define_insn ""
  422.   [(set (match_operand:QI 0 "register_operand" "=r")
  423.     (eq (match_operand:QI 1 "register_operand" "r")
  424.         (match_operand:QI 2 "general_operand" "m")))]
  425.   ""
  426.   "cmp.8\\t%0,%1,%2:eq")
  427.  
  428. (define_insn ""
  429.   [(set (match_operand:QI 0 "register_operand" "=r")
  430.     (ne (match_operand:QI 1 "register_operand" "r")
  431.         (match_operand:QI 2 "general_operand" "m")))]
  432.   ""
  433.   "cmp.8\\t%0,%1,%2:ne")
  434.  
  435. (define_insn ""
  436.   [(set (match_operand:QI 0 "register_operand" "=r")
  437.     (le (match_operand:QI 1 "register_operand" "r")
  438.         (match_operand:QI 2 "general_operand" "m")))]
  439.   ""
  440.   "cmp.8\\t%0,%1,%2:le")
  441.  
  442. (define_insn ""
  443.   [(set (match_operand:QI 0 "register_operand" "=r")
  444.     (leu (match_operand:QI 1 "register_operand" "r")
  445.         (match_operand:QI 2 "general_operand" "m")))]
  446.   ""
  447.   "cmpu.8\\t%0,%1,%2:le")
  448.  
  449. (define_insn ""
  450.   [(set (match_operand:QI 0 "register_operand" "=r")
  451.     (lt (match_operand:QI 1 "register_operand" "r")
  452.         (match_operand:QI 2 "general_operand" "m")))]
  453.   ""
  454.   "cmp.8\\t%0,%1,%2:lt")
  455.  
  456. (define_insn ""
  457.   [(set (match_operand:QI 0 "register_operand" "=r")
  458.     (ltu (match_operand:QI 1 "register_operand" "r")
  459.         (match_operand:QI 2 "general_operand" "m")))]
  460.   ""
  461.   "cmpu.8\\t%0,%1,%2:lt")
  462.  
  463. (define_insn ""
  464.   [(set (match_operand:QI 0 "register_operand" "=r")
  465.     (ge (match_operand:QI 1 "register_operand" "r")
  466.         (match_operand:QI 2 "general_operand" "m")))]
  467.   ""
  468.   "cmp.8\\t%0,%1,%2:ge")
  469.  
  470. (define_insn ""
  471.   [(set (match_operand:QI 0 "register_operand" "=r")
  472.     (geu (match_operand:QI 1 "register_operand" "r")
  473.         (match_operand:QI 2 "general_operand" "m")))]
  474.   ""
  475.   "cmpu.8\\t%0,%1,%2:ge")
  476.  
  477. (define_insn ""
  478.   [(set (match_operand:QI 0 "register_operand" "=r")
  479.     (gt (match_operand:QI 1 "register_operand" "r")
  480.         (match_operand:QI 2 "general_operand" "m")))]
  481.   ""
  482.   "cmp.8\\t%0,%1,%2:gt")
  483.  
  484. (define_insn ""
  485.   [(set (match_operand:QI 0 "register_operand" "=r")
  486.     (gtu (match_operand:QI 1 "register_operand" "r")
  487.         (match_operand:QI 2 "general_operand" "m")))]
  488.   ""
  489.   "cmpu.8\\t%0,%1,%2:gt")
  490.  
  491.  
  492.  
  493. (define_insn "movdf"  [(set (match_operand:DF 0 "general_operand" "=r,m")
  494.     (match_operand:DF 1 "general_operand" "rm,r"))]
  495.   ""
  496.   "*
  497. {
  498.   if (which_alternative == 0)
  499.     return \"ld.64\\t%0,%1\";
  500.   return \"st.64\\t%1,%0\";
  501. }")
  502.  
  503. (define_insn "movsf"
  504.   [(set (match_operand:SF 0 "general_operand" "=r,m")
  505.     (match_operand:SF 1 "general_operand" "rm,r"))]
  506.   ""
  507.   "*
  508. {
  509.   if (which_alternative == 0)
  510.     return \"ld.32\\t%0,%1\";
  511.   return \"st.32\\t%1,%0\";
  512. }")
  513.  
  514. (define_insn "movdi"
  515.   [(set (match_operand:DI 0 "general_operand" "=r,m,rm")
  516.     (match_operand:DI 1 "general_operand" "g,r,I"))]
  517.   ""
  518.   "*
  519.   if (which_alternative == 0)
  520.     return \"ld.64\\t%0,%1\";
  521.   else if (which_alternative == 1)
  522.     return \"st.64\\t%1,%0\";
  523.   else
  524.     if (GET_CODE(operands[1])==CONST_INT) {
  525.       if (INTVAL(operands[1]) >= 0)
  526.         return \"sti.64\\t%c1,%0\";
  527.       else
  528.         return \"stin.64\\t%n1,%0\";
  529.     }
  530. ")
  531.  
  532. (define_insn "movsi"
  533.   [(set (match_operand:SI 0 "general_operand" "=r,m,r")
  534.     (match_operand:SI 1 "general_operand" "rm,rI,i"))]
  535.   ""
  536.   "*
  537.   if (which_alternative == 0)
  538.     return \"ld.32\\t%0,%1\";
  539.   else if (which_alternative == 1) {
  540.     if (GET_CODE(operands[1])==CONST_INT) {
  541.       if (INTVAL(operands[1]) >= 0)
  542.         return \"sti.32\\t%c1,%0\";
  543.       else
  544.         return \"stin.32\\t%n1,%0\";
  545.     }
  546.     return \"st.32\\t%1,%0\";
  547.   } else
  548.     return \"ld.64\\t%0,%1 ; I only want 32\";
  549. ")
  550.  
  551. (define_insn "movhi"
  552.   [(set (match_operand:HI 0 "general_operand" "=r,m,r")
  553.     (match_operand:HI 1 "general_operand" "m,rI,ri"))]
  554.   ""
  555.   "*
  556. {
  557.   if (which_alternative == 0)
  558.     return \"ld.16\\t%0,%1\";
  559.   if (which_alternative == 2)
  560.     return \"ld.64\\t%0,%1\\t; I only want 16\";
  561.   if (GET_CODE(operands[1])==CONST_INT) {
  562.     if (INTVAL(operands[1]) >= 0)
  563.       return \"sti.16\\t%c1,%0\";
  564.     else
  565.       return \"stin.16\\t%n1,%0\";
  566.   }
  567.   return \"st.16\\t%1,%0\";
  568. }")
  569.  
  570. (define_insn "movqi"
  571.   [(set (match_operand:QI 0 "general_operand" "=r,m,r")
  572.     (match_operand:QI 1 "general_operand" "m,rI,ri"))]
  573.   ""
  574.   "*
  575. {
  576.   if (which_alternative == 0)
  577.     return \"ld.8\\t%0,%1\";
  578.   if (which_alternative == 2)
  579.     return \"ld.64\\t%0,%1\\t; I only want 8\";
  580.   if (GET_CODE(operands[1])==CONST_INT) {
  581.     if (INTVAL(operands[1]) >= 0)
  582.       return \"sti.8\\t%c1,%0\";
  583.     else
  584.       return \"stin.8\\t%n1,%0\";
  585.   }
  586.   return \"st.8\\t%1,%0\";
  587. }")
  588.  
  589. ;; Extension and truncation insns.
  590. ;; Those for integer source operand
  591. ;; are ordered widest source type first.
  592.  
  593. (define_insn "truncdfsf2"
  594.   [(set (match_operand:SF 0 "register_operand" "=r")
  595.     (truncate:SF (match_operand:DF 1 "general_operand" "rm")))]
  596.   ""
  597.   "cvt.ds\\t%0,%1")
  598.  
  599. (define_insn "truncdiqi2"
  600.   [(set (match_operand:QI 0 "general_operand" "=r,m,r")
  601.     (truncate:QI (match_operand:DI 1 "general_operand" "m,r,0")))]
  602.   ""
  603.   "*
  604. {
  605.   if (which_alternative == 0)
  606.     return \"ld.8\\t%0,%1\";
  607.   else if (which_alternative == 1)
  608.     return \"st.8\\t%1,%0\";
  609.   return \"\";
  610. }")
  611.  
  612. (define_insn "truncdihi2"
  613.   [(set (match_operand:HI 0 "general_operand" "=r,m,r")
  614.     (truncate:HI (match_operand:DI 1 "general_operand" "m,r,0")))]
  615.   ""
  616.   "*
  617. {
  618.   if (which_alternative == 0)
  619.     return \"ld.16\\t%0,%1\";
  620.   if (which_alternative == 1)
  621.     return \"st.16\\t%1,%0\";
  622.   return \"\";
  623. }")
  624.  
  625. (define_insn "truncdisi2"
  626.   [(set (match_operand:SI 0 "general_operand" "=r,m")
  627.     (truncate:SI (match_operand:DI 1 "general_operand" "rm,r")))]
  628.   ""
  629.   "*
  630. {
  631.   if (which_alternative == 0)
  632.     return \"ld.32\\t%0,%1\";
  633.   return \"st.32\\t%1,%0\";
  634. }")
  635.  
  636. (define_insn "truncsiqi2"
  637.   [(set (match_operand:QI 0 "general_operand" "=r,m,r")
  638.     (truncate:QI (match_operand:SI 1 "general_operand" "m,r,0")))]
  639.   ""
  640.   "*
  641. {
  642.   if (which_alternative == 0)
  643.     return \"ld.8\\t%0,%1\";
  644.   if (which_alternative == 1)
  645.     return \"st.8\\t%1,%0\";
  646.   return \"\";
  647. }")
  648.  
  649. (define_insn "truncsihi2"
  650.   [(set (match_operand:HI 0 "general_operand" "=r,m,r")
  651.     (truncate:HI (match_operand:SI 1 "general_operand" "m,r,0")))]
  652.   ""
  653.   "*
  654. {
  655.   if (which_alternative == 0)
  656.     return \"ld.16\\t%0,%1\";
  657.   if (which_alternative == 1)
  658.     return \"st.16\\t%1,%0\";
  659.   return \"\";
  660. }")
  661.  
  662. (define_insn "trunchiqi2"
  663.   [(set (match_operand:QI 0 "general_operand" "=r,m,r")
  664.     (truncate:QI (match_operand:HI 1 "general_operand" "m,r,0")))]
  665.   ""
  666.   "*
  667. {
  668.   if (which_alternative == 0)
  669.     return \"ld.8\\t%0,%1\";
  670.   if (which_alternative == 1)
  671.     return \"st.8\\t%1,%0\";
  672.   return \"\";
  673. }")
  674.  
  675. (define_insn "extendsfdf2"
  676.   [(set (match_operand:DF 0 "register_operand" "=r")
  677.     (sign_extend:DF (match_operand:SF 1 "general_operand" "rm")))]
  678.   ""
  679.   "cvt.sd\\t%0,%1")
  680.  
  681. (define_insn "extendsidi2"
  682.   [(set (match_operand:DI 0 "register_operand" "=r")
  683.     (sign_extend:DI (match_operand:SI 1 "general_operand" "rm")))]
  684.   ""
  685.   "ld.32\\t%0,%1")
  686.  
  687. (define_insn "extendhisi2"
  688.   [(set (match_operand:SI 0 "register_operand" "=r,r")
  689.     (sign_extend:SI (match_operand:HI 1 "general_operand" "m,r")))]
  690.   ""
  691.   "*
  692.      if (which_alternative==0)
  693.        return \"ld.16\\t%0,%1\";
  694.      return \"extract\\t%0,%1:bit 48,16\";
  695. ")
  696.  
  697. (define_insn "extendhidi2"
  698.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  699.     (sign_extend:DI (match_operand:HI 1 "general_operand" "m,r")))]
  700.   ""
  701.   "*
  702.      if (which_alternative==0)
  703.        return \"ld.16\\t%0,%1\";
  704.      return \"extract\\t%0,%1:bit 48,16\";
  705. ")
  706.  
  707. (define_insn "extendqihi2"
  708.   [(set (match_operand:HI 0 "register_operand" "=r,r")
  709.     (sign_extend:HI (match_operand:QI 1 "general_operand" "m,r")))]
  710.   ""
  711.   "*
  712.      if (which_alternative==0)
  713.        return \"ld.8\\t%0,%1\";
  714.      return \"extract\\t%0,%1:bit 56,8\";
  715. ")
  716.  
  717. (define_insn "extendqisi2"
  718.   [(set (match_operand:SI 0 "register_operand" "=r,r")
  719.     (sign_extend:SI (match_operand:QI 1 "general_operand" "m,r")))]
  720.   ""
  721.   "*
  722.      if (which_alternative==0)
  723.        return \"ld.8\\t%0,%1\";
  724.      return \"extract\\t%0,%1:bit 56,8\";
  725. ")
  726.  
  727. (define_insn "extendqidi2"
  728.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  729.     (sign_extend:DI (match_operand:QI 1 "general_operand" "m,r")))]
  730.   ""
  731.   "*
  732.      if (which_alternative==0)
  733.        return \"ld.8\\t%0,%1\";
  734.      return \"extract\\t%0,%1:bit 56,8\";
  735. ")
  736.  
  737. (define_insn "zero_extendsidi2"
  738.   [(set (match_operand:DI 0 "register_operand" "=r")
  739.     (zero_extend:DI (match_operand:SI 1 "general_operand" "rm")))]
  740.   ""
  741.   "ldz.32\\t%0,%1")
  742.  
  743.  
  744. (define_insn "zero_extendhisi2"
  745.   [(set (match_operand:SI 0 "register_operand" "=r,r")
  746.     (zero_extend:SI (match_operand:HI 1 "general_operand" "m,r")))]
  747.   ""
  748.   "*
  749.      if (which_alternative==0)
  750.        return \"ldz.16\\t%0,%1\";
  751.      return \"extractz\\t%0,%1:bit 48,16\";
  752. ")
  753.  
  754. (define_insn "zero_extendhidi2"
  755.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  756.     (zero_extend:DI (match_operand:HI 1 "general_operand" "m,r")))]
  757.   ""
  758.   "*
  759.      if (which_alternative==0)
  760.        return \"ldz.16\\t%0,%1\";
  761.      return \"extractz\\t%0,%1:bit 48,16\";
  762. ")
  763.  
  764. (define_insn "zero_extendqihi2"
  765.   [(set (match_operand:HI 0 "register_operand" "=r,r")
  766.     (zero_extend:HI (match_operand:QI 1 "general_operand" "m,r")))]
  767.   ""
  768.   "*
  769.      if (which_alternative==0)
  770.        return \"ldz.8\\t%0,%1\";
  771.      return \"extractz\\t%0,%1:bit 56,8\";
  772. ")
  773.  
  774. (define_insn "zero_extendqisi2"
  775.   [(set (match_operand:SI 0 "register_operand" "=r,r")
  776.     (zero_extend:SI (match_operand:QI 1 "general_operand" "m,r")))]
  777.   ""
  778.   "*
  779.      if (which_alternative==0)
  780.        return \"ldz.8\\t%0,%1\";
  781.      return \"extractz\\t%0,%1:bit 56,8\";
  782. ")
  783.  
  784. (define_insn "zero_extendqidi2"
  785.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  786.     (zero_extend:DI (match_operand:QI 1 "general_operand" "m,r")))]
  787.   ""
  788.   "*
  789.      if (which_alternative==0)
  790.        return \"ldz.8\\t%0,%1\";
  791.      return \"extractz\\t%0,%1:bit 56,8\";
  792. ")
  793.  
  794.  
  795. (define_insn "ashrdi3"
  796.   [(set (match_operand:DI 0 "register_operand" "=r")
  797.     (ashiftrt:DI (match_operand:DI 1 "register_operand" "r")
  798.            (match_operand:SI 2 "general_operand" "rn")))]
  799.   ""
  800.   "sra\\t%0,%1,%2")
  801.  
  802. (define_insn "lshrdi3"
  803.   [(set (match_operand:DI 0 "register_operand" "=r")
  804.     (lshiftrt:DI (match_operand:DI 1 "register_operand" "r")
  805.            (match_operand:SI 2 "general_operand" "rn")))]
  806.   ""
  807.   "srl\\t%0,%1,%2")
  808.  
  809. (define_insn "ashldi3"
  810.   [(set (match_operand:DI 0 "register_operand" "=r")
  811.     (ashift:DI (match_operand:DI 1 "register_operand" "r")
  812.            (match_operand:SI 2 "general_operand" "rn")))]
  813.   ""
  814.   "sla\\t%0,%1,%2")
  815.  
  816. (define_insn "anddi3"
  817.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  818.     (and:DI (match_operand:DI 1 "general_operand" "%0,r")
  819.         (match_operand:DI 2 "general_operand" "g,g")))]
  820.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  821.   "*
  822.     if (which_alternative == 0)
  823.       return \"and\\t%0,%2\";
  824.     return \"and\\t%0,%1,%2\";
  825. ")
  826.  
  827. (define_insn "iordi3"
  828.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  829.     (ior:DI (match_operand:DI 1 "general_operand" "%0,r")
  830.         (match_operand:DI 2 "general_operand" "g,g")))]
  831.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  832.   "*
  833.     if (which_alternative == 0)
  834.       return \"or\\t%0,%2\";
  835.     return \"or\\t%0,%1,%2\";
  836. ")
  837.  
  838. (define_insn "xordi3"
  839.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  840.     (xor:DI (match_operand:DI 1 "general_operand" "%0,r")
  841.         (match_operand:DI 2 "general_operand" "g,g")))]
  842.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  843.   "*
  844.     if (which_alternative == 0)
  845.       return \"xor\\t%0,%2\";
  846.     return \"xor\\t%0,%1,%2\";
  847. ")
  848.  
  849. (define_insn "one_cmpldi2"
  850.   [(set (match_operand:DI 0 "register_operand" "=r")
  851.     (not:DI (match_operand:DI 1 "general_operand" "rm")))]
  852.   ""
  853.   "not\\t%0,%1")
  854.  
  855. ;; gcc 2.1 does not widen ~si into ~di.
  856. (define_insn "one_cmplsi2"
  857.   [(set (match_operand:SI 0 "register_operand" "=r")
  858.     (not:SI (match_operand:SI 1 "register_operand" "r")))]
  859.   ""
  860.   "not\\t%0,%1")
  861.  
  862. (define_insn "negdi2"
  863.   [(set (match_operand:DI 0 "register_operand" "=r")
  864.     (neg:DI (match_operand:DI 1 "general_operand" "rm")))]
  865.   ""
  866.   "neg.64\\t%0,%1")
  867.  
  868. (define_insn "negsi2"
  869.   [(set (match_operand:SI 0 "register_operand" "=r,r")
  870.     (neg:SI (match_operand:SI 1 "general_operand" "m,r")))]
  871.   ""
  872.   "*
  873.     if (which_alternative == 0)
  874.       return \"neg.32\\t%0,%1\";
  875.     return \"neg.64\\t%0,%1 ; I only want 32\";
  876. ")
  877.  
  878. (define_insn "neghi2"
  879.   [(set (match_operand:HI 0 "register_operand" "=r,r")
  880.     (neg:HI (match_operand:HI 1 "general_operand" "m,r")))]
  881.   ""
  882.   "*
  883.     if (which_alternative == 0)
  884.       return \"neg.16\\t%0,%1\";
  885.     return \"neg.64\\t%0,%1 ; I only want 16\";
  886. ")
  887.  
  888. (define_insn "adddf3"
  889.   [(set (match_operand:DF 0 "register_operand" "=r")
  890.     (plus:DF (match_operand:DF 1 "general_operand" "%0")
  891.           (match_operand:DF 2 "general_operand" "rm")))]
  892.   ""
  893.   "fadd.64\\t%0,%2")
  894.  
  895. (define_insn "addsf3"
  896.   [(set (match_operand:SF 0 "register_operand" "=r")
  897.     (plus:SF (match_operand:SF 1 "general_operand" "%0")
  898.          (match_operand:SF 2 "general_operand" "rm")))]
  899.   ""
  900.   "fadd.32\\t%0,%2")
  901.  
  902. ;; There is also an addi.64  4,.r0'' optimization
  903. (define_insn "adddi3"
  904.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  905.     (plus:DI (match_operand:DI 1 "general_operand" "%0,r")
  906.          (match_operand:DI 2 "general_operand" "g,g")))]
  907.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  908.   "*
  909.     if (which_alternative == 0)
  910.       return \"add.64\\t%0,%2\";
  911.     return \"add.64\\t%0,%1,%2\";
  912. ")
  913.  
  914. (define_insn "addsi3"
  915.   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
  916.     (plus:SI (match_operand:SI 1 "general_operand" "%0,r,0")
  917.          (match_operand:SI 2 "general_operand" "m,m,g")))]
  918.   "1 /*which_alternative != 1 || check356(operands[2])*/"
  919.   "*
  920.     if (which_alternative == 0)
  921.       return \"add.32\\t%0,%2\";
  922.     if (which_alternative == 1)
  923.       return \"add.32\\t%0,%1,%2\";
  924.     return \"add.64\\t%0,%2 ; I only want 32\";
  925. ")
  926.  
  927. (define_insn "addhi3"
  928.   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
  929.     (plus:HI (match_operand:HI 1 "general_operand" "%0,r,0")
  930.          (match_operand:HI 2 "general_operand" "m,m,g")))]
  931.   "1 /*which_alternative != 1 || check356(operands[2])*/"
  932.   "*
  933.     if (which_alternative == 0)
  934.       return \"add.16\\t%0,%2\";
  935.     if (which_alternative == 1)
  936.       return \"add.16\\t%0,%1,%2\";
  937.     return \"add.64\\t%0,%2 ; I only want 16\";
  938. ")
  939.  
  940. (define_insn "subdf3"
  941.   [(set (match_operand:DF 0 "register_operand" "=r")
  942.     (minus:DF (match_operand:DF 1 "general_operand" "0")
  943.           (match_operand:DF 2 "general_operand" "rm")))]
  944.   ""
  945.   "fsub.64\\t%0,%2")
  946.  
  947. (define_insn "subsf3"
  948.   [(set (match_operand:SF 0 "register_operand" "=r")
  949.     (minus:SF (match_operand:SF 1 "general_operand" "0")
  950.           (match_operand:SF 2 "general_operand" "rm")))]
  951.   ""
  952.   "fsub.32\\t%0,%2")
  953.  
  954. (define_insn "subdi3"
  955.   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
  956.     (minus:DI (match_operand:DI 1 "general_operand" "0,g,r")
  957.           (match_operand:DI 2 "general_operand" "g,r,g")))]
  958.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  959.   "*
  960.     if (which_alternative == 0)
  961.       return \"sub.64\\t%0,%2\";
  962.     else if (which_alternative == 1)
  963.       return \"subr.64\\t%0,%2,%1\";
  964.     else
  965.       return \"sub.64\\t%0,%1,%2\";
  966. ")
  967.  
  968. (define_insn "subsi3"
  969.   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
  970.     (minus:SI (match_operand:SI 1 "general_operand" "0,m,r,0")
  971.           (match_operand:SI 2 "general_operand" "m,r,m,g")))]
  972.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  973.   "*
  974.     if (which_alternative == 0)
  975.       return \"sub.32\\t%0,%2\";
  976.     else if (which_alternative == 1)
  977.       return \"subr.32\\t%0,%2,%1\";
  978.     else if (which_alternative == 2)
  979.       return \"sub.32\\t%0,%1,%2\";
  980.     else
  981.       return \"sub.64\\t%0,%2 ; I only want 32\";
  982. ")
  983.  
  984. (define_insn "subhi3"
  985.   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r")
  986.     (minus:HI (match_operand:HI 1 "general_operand" "0,m,r,0")
  987.           (match_operand:HI 2 "general_operand" "m,r,m,g")))]
  988.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  989.   "*
  990.     if (which_alternative == 0)
  991.       return \"sub.16\\t%0,%2\";
  992.     else if (which_alternative == 1)
  993.       return \"subr.16\\t%0,%2,%1\";
  994.     else if (which_alternative == 2)
  995.       return \"sub.16\\t%0,%1,%2\";
  996.     else
  997.       return \"sub.64\\t%0,%2 ; I only want 16\";
  998. ")
  999.  
  1000. (define_insn "muldf3"
  1001.   [(set (match_operand:DF 0 "register_operand" "=r")
  1002.     (mult:DF (match_operand:DF 1 "general_operand" "%0")
  1003.          (match_operand:DF 2 "general_operand" "rm")))]
  1004.   ""
  1005.   "fmul.64\\t%0,%2")
  1006.  
  1007. (define_insn "mulsf3"
  1008.   [(set (match_operand:SF 0 "register_operand" "=r")
  1009.     (mult:SF (match_operand:SF 1 "general_operand" "%0")
  1010.          (match_operand:SF 2 "general_operand" "rm")))]
  1011.   ""
  1012.   "fmul.32\\t%0,%2")
  1013.  
  1014. (define_insn "muldi3"
  1015.   [(set (match_operand:DI 0 "register_operand" "=r,r")
  1016.     (mult:DI (match_operand:DI 1 "general_operand" "%0,r")
  1017.          (match_operand:DI 2 "general_operand" "g,g")))]
  1018.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  1019.   "*
  1020.     if (which_alternative == 0)
  1021.       return \"mul.64\\t%0,%2\";
  1022.     return \"mul.64\\t%0,%1,%2\";
  1023. ")
  1024.  
  1025. (define_insn "mulsi3"
  1026.   [(set (match_operand:SI 0 "register_operand" "=r,r,r")
  1027.     (mult:SI (match_operand:SI 1 "general_operand" "%0,r,0")
  1028.          (match_operand:SI 2 "general_operand" "m,m,g")))]
  1029.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  1030.   "*
  1031.     if (which_alternative == 0)
  1032.       return \"mul.32\\t%0,%2\";
  1033.     else if (which_alternative == 1)
  1034.       return \"mul.32\\t%0,%1,%2\";
  1035.     else
  1036.       return \"mul.64\\t%0,%2 ; I only want 32\";
  1037. ")
  1038.  
  1039. (define_insn "mulhi3"
  1040.   [(set (match_operand:HI 0 "register_operand" "=r,r,r")
  1041.     (mult:HI (match_operand:HI 1 "general_operand" "%0,r,0")
  1042.          (match_operand:HI 2 "general_operand" "m,m,g")))]
  1043.   "1 /*which_alternative == 0 || check356(operands[2])*/"
  1044.   "*
  1045.     if (which_alternative == 0)
  1046.       return \"mul.16\\t%0,%2\";
  1047.     else if (which_alternative == 1)
  1048.       return \"mul.16\\t%0,%1,%2\";
  1049.     else
  1050.       return \"mul.64\\t%0,%2 ; I only want 16\";
  1051. ")
  1052.  
  1053. (define_insn "divdf3"
  1054.   [(set (match_operand:DF 0 "register_operand" "=r")
  1055.     (div:DF (match_operand:DF 1 "general_operand" "0")
  1056.         (match_operand:DF 2 "general_operand" "rm")))]
  1057.   ""
  1058.   "fdiv.64\\t%0,%2")
  1059.  
  1060. (define_insn "divsf3"
  1061.   [(set (match_operand:SF 0 "register_operand" "=r")
  1062.     (div:SF (match_operand:SF 1 "general_operand" "0")
  1063.         (match_operand:SF 2 "general_operand" "rm")))]
  1064.   ""
  1065.   "fdiv.32\\t%0,%2")
  1066.  
  1067. (define_insn "divdi3"
  1068.   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
  1069.     (div:DI (match_operand:DI 1 "general_operand" "0,g,r")
  1070.         (match_operand:DI 2 "general_operand" "g,r,g")))]
  1071.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1072.   "*
  1073.     if (which_alternative == 0)
  1074.       return \"div.64\\t%0,%2\";
  1075.     else if (which_alternative == 1)
  1076.       return \"divr.64\\t%0,%2,%1\";
  1077.     else
  1078.       return \"div.64\\t%0,%1,%2\";
  1079. ")
  1080.  
  1081. (define_insn "divsi3"
  1082.   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
  1083.     (div:SI (match_operand:SI 1 "general_operand" "0,m,r,0")
  1084.         (match_operand:SI 2 "general_operand" "m,r,m,g")))]
  1085.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1086.   "*
  1087. /* We don't ignore high bits. */
  1088. if (0) {
  1089.     if (which_alternative == 0)
  1090.       return \"div.32\\t%0,%2\";
  1091.     else if (which_alternative == 1)
  1092.       return \"divr.32\\t%0,%2,%1\";
  1093.     else if (which_alternative == 2)
  1094.       return \"div.32\\t%0,%1,%2\";
  1095.     else
  1096.       return \"ld.32\\t%0,%0\;div.64\\t%0,%2 ; I only want 32\";
  1097. } else {
  1098.     if (which_alternative == 0)
  1099.       return \"ld.32\\t%0,%0\;div.32\\t%0,%2\";
  1100.     else if (which_alternative == 1)
  1101.       return \"ld.32\\t%2,%2\;divr.32\\t%0,%2,%1\";
  1102.     else if (which_alternative == 2)
  1103.       return \"ld.32\\t%1,%1\;div.32\\t%0,%1,%2\";
  1104.     else
  1105.       return \"ld.32\\t%0,%0\;div.64\\t%0,%2 ; I only want 32\";
  1106. }
  1107. ")
  1108.  
  1109. (define_insn "divhi3"
  1110.   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
  1111.     (div:HI (match_operand:HI 1 "general_operand" "0,m,r,0,0")
  1112.         (match_operand:HI 2 "general_operand" "m,r,m,r,i")))]
  1113.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1114.   "*
  1115.     if (which_alternative == 0)
  1116.       return \"extract\\t%0,%0:bit 48,16\;div.16\\t%0,%2\";
  1117.     else if (which_alternative == 1)
  1118.       return \"extract\\t%2,%2:bit 48,16\;divr.16\\t%0,%2,%1\";
  1119.     else if (which_alternative == 2)
  1120.       return \"extract\\t%1,%1:bit 48,16\;div.16\\t%0,%1,%2\";
  1121.     else if (which_alternative == 3)
  1122.       return \"extract\\t%0,%0:bit 48,16\;extract\\t%2,%2:bit 48,16\;div.64\\t%0,%2 ; I only want 16\";
  1123.     else
  1124.       return \"extract\\t%0,%0:bit 48,16\;div.64\\t%0,%2 ; I only want 16\";
  1125. ")
  1126.  
  1127. (define_insn "modhi3"
  1128.   [(set (match_operand:HI 0 "register_operand" "=r,r,r,r,r")
  1129.     (mod:HI (match_operand:HI 1 "general_operand" "0,m,r,0,0")
  1130.         (match_operand:HI 2 "general_operand" "m,r,m,r,i")))]
  1131.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1132.   "*
  1133.     if (which_alternative == 0)
  1134.       return \"extract\\t%0,%0:bit 48,16\;rem.16\\t%0,%2\";
  1135.     else if (which_alternative == 1)
  1136.       return \"extract\\t%2,%2:bit 48,16\;remr.16\\t%0,%2,%1\";
  1137.     else if (which_alternative == 2)
  1138.       return \"extract\\t%1,%1:bit 48,16\;rem.16\\t%0,%1,%2\";
  1139.     else if (which_alternative == 3)
  1140.       return \"extract\\t%0,%0:bit 48,16\;extract\\t%2,%2:bit 48,16\;rem.64\\t%0,%2 ; I only want 16\";
  1141.     else
  1142.       return \"extract\\t%0,%0:bit 48,16\;rem.64\\t%0,%2 ; I only want 16\";
  1143. ")
  1144.  
  1145. (define_insn "moddi3"
  1146.   [(set (match_operand:DI 0 "register_operand" "=r,r,r")
  1147.     (mod:DI (match_operand:DI 1 "general_operand" "0,g,r")
  1148.         (match_operand:DI 2 "general_operand" "g,r,g")))]
  1149.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1150.   "*
  1151.     if (which_alternative == 0)
  1152.       return \"rem.64\\t%0,%2\";
  1153.     else if (which_alternative == 1)
  1154.       return \"remr.64\\t%0,%2,%1\";
  1155.     else
  1156.       return \"rem.64\\t%0,%1,%2\";
  1157. ")
  1158.  
  1159. (define_insn "modsi3"
  1160.   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
  1161.     (mod:SI (match_operand:SI 1 "general_operand" "0,m,r,0")
  1162.         (match_operand:SI 2 "general_operand" "m,r,m,g")))]
  1163.   "1 /*which_alternative == 0 || check356(operands[which_alternative])*/"
  1164.   "*
  1165. /* There is a micro code bug with the below... */
  1166. if (0) {
  1167.     if (which_alternative == 0)
  1168.       return \"rem.32\\t%0,%2\";
  1169.     else if (which_alternative == 1)
  1170.       return \"remr.32\\t%0,%2,%1\";
  1171.     else if (which_alternative == 2)
  1172.       return \"rem.32\\t%0,%1,%2\";
  1173.     else
  1174.       return \"ld.32\\t%0,%0\;rem.64\\t%0,%2 ; I only want 32\";
  1175. } else {
  1176.     if (which_alternative == 0)
  1177.       return \"ld.32\\t%0,%0\;rem.32\\t%0,%2\";
  1178.     else if (which_alternative == 1)
  1179.       return \"ld.32\\t%2,%2\;remr.32\\t%0,%2,%1\";
  1180.     else if (which_alternative == 2)
  1181.       return \"ld.32\\t%1,%1\;rem.32\\t%0,%1,%2\";
  1182.     else
  1183.       return \"ld.32\\t%0,%0\;rem.64\\t%0,%2 ; I only want 32\";
  1184. }
  1185. ")
  1186.  
  1187.  
  1188. (define_insn "jump"
  1189.   [(set (pc)
  1190.     (label_ref (match_operand 0 "" "")))]
  1191.   ""
  1192.   "jmp\\t%l0")
  1193.  
  1194. (define_insn "indirect_jump"
  1195.   [(set (pc) (match_operand:SI 0 "register_operand" "r"))]
  1196.   ""
  1197. ;; Maybe %l0 is better, maybe we can relax register only.
  1198.   "verify this before use ld.32\\t.r0,%0\;br.reg\\t.r0")
  1199.  
  1200. (define_insn "beq"
  1201.   [(set (pc)
  1202.     (if_then_else (eq (cc0)
  1203.               (const_int 0))
  1204.               (label_ref (match_operand 0 "" ""))
  1205.               (pc)))]
  1206.   ""
  1207.   "* return cmp_jmp(\"\", 2, operands[0]); ")
  1208.  
  1209. (define_insn "bne"
  1210.   [(set (pc)
  1211.     (if_then_else (ne (cc0)
  1212.               (const_int 0))
  1213.               (label_ref (match_operand 0 "" ""))
  1214.               (pc)))]
  1215.   ""
  1216.   "* return cmp_jmp(\"\", 8, operands[0]); ")
  1217.  
  1218. (define_insn "bgt"
  1219.   [(set (pc)
  1220.     (if_then_else (gt (cc0)
  1221.               (const_int 0))
  1222.               (label_ref (match_operand 0 "" ""))
  1223.               (pc)))]
  1224.   ""
  1225.   "* return cmp_jmp(\"\", 0, operands[0]); ")
  1226.  
  1227. (define_insn "bgtu"
  1228.   [(set (pc)
  1229.     (if_then_else (gtu (cc0)
  1230.               (const_int 0))
  1231.               (label_ref (match_operand 0 "" ""))
  1232.               (pc)))]
  1233.   ""
  1234.   "* return cmp_jmp(\"u\", 0, operands[0]); ")
  1235.  
  1236. (define_insn "blt"
  1237.   [(set (pc)
  1238.     (if_then_else (lt (cc0)
  1239.               (const_int 0))
  1240.               (label_ref (match_operand 0 "" ""))
  1241.               (pc)))]
  1242.   ""
  1243.   "* return cmp_jmp(\"\", 6, operands[0]); ")
  1244.  
  1245. (define_insn "bltu"
  1246.   [(set (pc)
  1247.     (if_then_else (ltu (cc0)
  1248.               (const_int 0))
  1249.               (label_ref (match_operand 0 "" ""))
  1250.               (pc)))]
  1251.   ""
  1252.   "* return cmp_jmp(\"u\", 6, operands[0]); ")
  1253.  
  1254. (define_insn "bge"
  1255.   [(set (pc)
  1256.     (if_then_else (ge (cc0)
  1257.               (const_int 0))
  1258.               (label_ref (match_operand 0 "" ""))
  1259.               (pc)))]
  1260.   ""
  1261.   "* return cmp_jmp(\"\", 4, operands[0]); ")
  1262.  
  1263. (define_insn "bgeu"
  1264.   [(set (pc)
  1265.     (if_then_else (geu (cc0)
  1266.               (const_int 0))
  1267.               (label_ref (match_operand 0 "" ""))
  1268.               (pc)))]
  1269.   ""
  1270.   "* return cmp_jmp(\"u\", 4, operands[0]); ")
  1271.  
  1272. (define_insn "ble"
  1273.   [(set (pc)
  1274.     (if_then_else (le (cc0)
  1275.               (const_int 0))
  1276.               (label_ref (match_operand 0 "" ""))
  1277.               (pc)))]
  1278.   ""
  1279.   "* return cmp_jmp(\"\", 10, operands[0]); ")
  1280.  
  1281. (define_insn "bleu"
  1282.   [(set (pc)
  1283.     (if_then_else (leu (cc0)
  1284.               (const_int 0))
  1285.               (label_ref (match_operand 0 "" ""))
  1286.               (pc)))]
  1287.   ""
  1288.   "* return cmp_jmp(\"u\", 10, operands[0]); ")
  1289.  
  1290. (define_insn ""
  1291.   [(set (pc)
  1292.     (if_then_else (eq (cc0)
  1293.               (const_int 0))
  1294.               (pc)
  1295.               (label_ref (match_operand 0 "" ""))))]
  1296.   ""
  1297.   "* return cmp_jmp(\"\", 8, operands[0]); ")
  1298.  
  1299. (define_insn ""
  1300.   [(set (pc)
  1301.     (if_then_else (ne (cc0)
  1302.               (const_int 0))
  1303.               (pc)
  1304.               (label_ref (match_operand 0 "" ""))))]
  1305.   ""
  1306.   "* return cmp_jmp(\"\", 2, operands[0]); ")
  1307.  
  1308. (define_insn ""
  1309.   [(set (pc)
  1310.     (if_then_else (gt (cc0)
  1311.               (const_int 0))
  1312.               (pc)
  1313.               (label_ref (match_operand 0 "" ""))))]
  1314.   ""
  1315.   "* return cmp_jmp(\"\", 10, operands[0]); ")
  1316.  
  1317. (define_insn ""
  1318.   [(set (pc)
  1319.     (if_then_else (gtu (cc0)
  1320.               (const_int 0))
  1321.               (pc)
  1322.               (label_ref (match_operand 0 "" ""))))]
  1323.   ""
  1324.   "* return cmp_jmp(\"u\", 10, operands[0]); ")
  1325.  
  1326. (define_insn ""
  1327.   [(set (pc)
  1328.     (if_then_else (lt (cc0)
  1329.               (const_int 0))
  1330.               (pc)
  1331.               (label_ref (match_operand 0 "" ""))))]
  1332.   ""
  1333.   "* return cmp_jmp(\"\", 4, operands[0]); ")
  1334.  
  1335. (define_insn ""
  1336.   [(set (pc)
  1337.     (if_then_else (ltu (cc0)
  1338.               (const_int 0))
  1339.               (pc)
  1340.               (label_ref (match_operand 0 "" ""))))]
  1341.   ""
  1342.   "* return cmp_jmp(\"u\", 4, operands[0]); ")
  1343.  
  1344. (define_insn ""
  1345.   [(set (pc)
  1346.     (if_then_else (ge (cc0)
  1347.               (const_int 0))
  1348.               (pc)
  1349.               (label_ref (match_operand 0 "" ""))))]
  1350.   ""
  1351.   "* return cmp_jmp(\"\", 6, operands[0]); ")
  1352.  
  1353. (define_insn ""
  1354.   [(set (pc)
  1355.     (if_then_else (geu (cc0)
  1356.               (const_int 0))
  1357.               (pc)
  1358.               (label_ref (match_operand 0 "" ""))))]
  1359.   ""
  1360.   "* return cmp_jmp(\"u\", 6, operands[0]); ")
  1361.  
  1362. (define_insn ""
  1363.   [(set (pc)
  1364.     (if_then_else (le (cc0)
  1365.               (const_int 0))
  1366.               (pc)
  1367.               (label_ref (match_operand 0 "" ""))))]
  1368.   ""
  1369.   "* return cmp_jmp(\"\", 0, operands[0]); ")
  1370.  
  1371. (define_insn ""
  1372.   [(set (pc)
  1373.     (if_then_else (leu (cc0)
  1374.               (const_int 0))
  1375.               (pc)
  1376.               (label_ref (match_operand 0 "" ""))))]
  1377.   ""
  1378.   "* return cmp_jmp(\"u\", 0, operands[0]); ")
  1379.  
  1380. ;; Note that operand 1 is total size of args, in bytes,
  1381. ;; and what the call insn wants is the number of words.
  1382. (define_insn "call"
  1383.   [(call (match_operand:QI 0 "general_operand" "m")
  1384.      (match_operand:QI 1 "general_operand" "g"))]
  1385.   ""
  1386.   "*
  1387.   if (GET_CODE (operands[0]) == MEM && GET_CODE (XEXP (operands[0], 0)) == REG)
  1388.     if (REGNO (XEXP (operands[0], 0)) != 0)
  1389.       return \"add.64\\t.sp,=-4\;ld.64\\t.r0,=.+11\;st.32\\t.r0,[.sp]\;br.reg\\t%r0\;add.64\\t.sp,=4\;add.64\\t.sp,%1\";
  1390.     else
  1391.       return \"add.64\\t.sp,=-4\;ld.64\\t.r1,=.+11\;st.32\\t.r1,[.sp]\;br.reg\\t%r0\;add.64\\t.sp,=4\;add.64\\t.sp,%1\";
  1392.   else
  1393.     return \"add.64\\t.sp,=-4\;call\\t%0\;add.64\\t.sp,=4\;add.64\\t.sp,%1\";
  1394.   ")
  1395.  
  1396. (define_insn "call_value"
  1397.   [(set (match_operand 0 "" "g")
  1398.     (call (match_operand:QI 1 "general_operand" "m")
  1399.           (match_operand:QI 2 "general_operand" "g")))]
  1400.   ""
  1401.   "*
  1402.   if (GET_CODE (operands[1]) == MEM && GET_CODE (XEXP (operands[1], 0)) == REG)
  1403.     if (REGNO (XEXP (operands[1], 0)) != 0)
  1404.       return \"add.64\\t.sp,=-4\;ld.64\\t.r0,=.+11\;st.32\\t.r0,[.sp]\;br.reg\\t%r1\;add.64\\t.sp,=4\;add.64\\t.sp,%2\";
  1405.     else
  1406.       return \"add.64\\t.sp,=-4\;ld.64\\t.r1,=.+11\;st.32\\t.r1,[.sp]\;br.reg\\t%r1\;add.64\\t.sp,=4\;add.64\\t.sp,%2\";
  1407.   else
  1408.     return \"add.64\\t.sp,=-4\;call\\t%1\;add.64\\t.sp,=4\;add.64\\t.sp,%2\";
  1409.   ")
  1410.  
  1411. (define_insn "tablejump"
  1412.   [(set (pc) (match_operand:SI 0 "register_operand" "r"))
  1413.    (use (label_ref (match_operand 1 "" "")))]
  1414.   ""
  1415.   "br.reg\\t%0")
  1416.  
  1417. (define_insn "nop"
  1418.   [(const_int 0)]
  1419.   ""
  1420.   "nop")
  1421.